﻿using Rougamo.Context;
using Rougamo;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AOP.Rougamo
{
    // 1.定义需要织入的代码，也可以直接使用快速开始中定义的LoggingAttribute
    public class LoggingMo : IMo
    {
        public AccessFlags Flags => AccessFlags.All;

        public void OnEntry(MethodContext context)
        {
            // 从context对象中能取到包括入参、类实例、方法描述等信息
            Console.WriteLine("方法执行前");
        }

        public void OnException(MethodContext context)
        {
            Console.WriteLine("方法执行异常", context.Exception);
        }

        public void OnExit(MethodContext context)
        {
            Console.WriteLine("方法退出时，不论方法执行成功还是异常，都会执行");
        }

        public void OnSuccess(MethodContext context)
        {
            Console.WriteLine("方法执行成功后");
        }
    }

    // 2.定义空接口
    public interface ILoggingRougamo : IRougamo<LoggingMo, LoggingAttribute>
    {
    }

    // 3.应用空接口，如果你编程时习惯将同一类型/领域的类定义一个父接口/父类，那么只需要父接口/父类实现该接口即可
    public interface IRepository<TModel, TId> : ILoggingRougamo
    {
        // ...
    }
}
